#include "jugador.h"

/** Con el constructor de jugador al crear el objeto lo situamos en la posición que queramos (X,Y)
 * e inicializamos el socket en la dirección y puerto de escucha correspondiente (se encarga el socket)
 * posteriormente recibimos la información inicial del servidor y se la pasamos a la función interpretar
 * y así podremos actuar en consecuencia en el main
*/
Jugador::Jugador(){}
Jugador::Jugador(int argc, char *argv[])
{
    thread_flag=false;
    i=0;
    inicial=-200;
    pthread_mutex_init (&this->_mutex, (pthread_mutexattr_t*) NULL);
    cliente.checkConnection(argc);
    cliente.socket(argv);
    recibir.start(this);
    cliente.enviar("(init Grupo_3)");
    thread_flag=false;
    usleep(15000);
    thread_flag=false;
    numero=datos.getNumero();
    cout<<"Jugador con el dorsal "<<numero<<" juego en el lado "<<datos.getSide()<<endl;
    datos.Seeinst["ball"].setDir(inicial);
    datos.Seeinst["ball"].setDist(inicial);
}




void Jugador::setnumero(int Nnumero)
{
    numero = Nnumero;
}

int Jugador::getnumero()
{
    return numero;
}

/** La función interpretar se encarga de recibir la cadena
  * (esto lo haremos con un thread) enviada por el servidor y colocar cada
  * variable en el struct correspondiente
  * Descomponemos la cadena y almacenamos las variables en los structs.
  * Para descomponerla buscaremos los parentesis (funcion leer) y extraemos
  * la informacion (con un switch la colocamos). */

void Jugador::interpretar(string h)
{
    parser.separardatos(h,datos);
}


void Jugador::golpear(int pot, double dir)
{
    msg.str("");
    msg << "(kick " << pot << " " << dir << ")";
    usleep(15000);
    msg.str("");
    msg << "(kick " << pot << " " << dir << ")";
}

void Jugador::mover(int pot)
{
    msg.str("");//BORRAMOS EL CONTENIDO PORQUE SI NO SE AÑADE AL FINAL
    msg<<"(dash "<<pot<<")";

}

void Jugador::girar(double ang) //VA EN FUNCION DEL MOMENTO. LE PASAMOS EL ANGULO QUE QUEREMOS GIRAR
{
    double momento;
    momento=ang*(1.0+5*(datos.Senseinst["speed"].getValue1()));
    msg.str("");
    if (momento<-180)
        momento=-180;
    if (momento>180)
        momento=180;
    msg<<"(turn "<<momento<<")";

}

void Jugador::mirar(double ang)
{
    msg.str("");
    msg<<"(turn_neck "<<ang<<")";
}

void Jugador::colocar(double x, double y)
{
    msg.str("");
    msg<<"(move "<<x<<" "<<y<<")";
}

void Jugador::seguirPelota ()
{
    if (cliente.getSbuffer().find("ball") == string::npos)
    {
        if(datos.Seeinst["ball"].getDir() == inicial){
            girar(10);
            usleep(15000);}
        else
        {
            girar (datos.Seeinst["ball"].getDir());
            usleep(15000);
        }
    }
    if (cliente.getSbuffer().find("ball") != string::npos)
    {
        double velocidad = datos.Seeinst["ball"].getDist()*10;
        if (datos.Seeinst["ball"].getDist()==inicial) velocidad=100;
        if (velocidad > 100 || velocidad < 0)
            velocidad = 100;
        mover(velocidad);
        usleep(15000);
    }
        if((datos.Seeinst["ball"].getDist() != 0) && (datos.Seeinst["ball"].getDist() < 0.7) && (datos.Seeinst["ball"].getDist()!=-200))
    {
        cout<<"----------------TIRO---------------"<<endl;
        golpear(60,45);
        usleep(15000);

    }
}
